class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        //找0和1相等的最长子数组
        //思路：把所有0变-1，题目不就变成最长和为0的子数组吗？
        //思路：找前0-i-1位置有多少个sum
        //   前缀和，下标
        unordered_map<int,int> hash;
        //第i个刚好和0 -1 0 1     i=2时，sum等于0,所以2-（-1）=3
        hash[0]=-1;              

        int sum=0,ret=0;
        for(int i=0;i<nums.size();i++)
        {
            //先把0的变-1
            if(nums[i]==0) nums[i]=-1;

            sum+=nums[i];       //前缀和

            //看看前面有没有和也为sum的
            if(hash.count(sum))
            {
                ret=max(ret,i-hash[sum]);       //更新最大长度
            }
            else//如果已经有了，就不用更新和为sum的下标了，因为最左肯定最长
            {
                hash[sum]=i;   
            }                            
        }
        return ret;
    }
};